Zapsat string do souboru

Otázka od: Pavel Hauptman

17. 9. 2004 8:59

Ahoj,
snazim se zapsat string do souboru, ale jako prvni znak stringu mi to
vzdycky zapise nesmysl. Takto to ukladam:

type TVetaS = record
       lngh: word;
       cod1: string[32];
     end;
var VetaS: TVetaS;
    fout: TFileStream;
begin
  FillChar(VetaS, SizeOf(VetaS), #0);
  VetaS.lngh := 4;
  VetaS.cod1 := 'ahoj'
  fout := TFileStream.Create(FName, fmOpenReadWrite);
  fout.Write(VetaS.lngh, 2);
  fout.Write(VetaS.cod1, 32);
  fout.Size := fout.Position;
  fout.free;
end;

Jak to mam udelat, aby mi to spravne zapisovalo data s retezcem dlouhym 32
bytu?

Diky a s pozdravem

Pavel Hauptman


Odpovedá: Ales Vasicek

17. 9. 2004 8:48

Ahoj

var
  FS : TFileStream;
  S : string;
begin
  S := 'Ahoj';
  FS := TFileStream.Create(.., ..);
  try
    FS.Write(Pointer(S)^, Length(S));
  finally
    FS.Free;
  end;
end;

> -----Original Message-----
> From: Pavel Hauptman [mailto:phauptman@bilbo.cz]
>
> snazim se zapsat string do souboru, ale jako prvni znak stringu mi to
> vzdycky zapise nesmysl. Takto to ukladam:
>
> type TVetaS = record
> lngh: word;
> cod1: string[32];
> end;
> var VetaS: TVetaS;
> fout: TFileStream;
> begin
> FillChar(VetaS, SizeOf(VetaS), #0);
> VetaS.lngh := 4;
> VetaS.cod1 := 'ahoj'
> fout := TFileStream.Create(FName, fmOpenReadWrite);
> fout.Write(VetaS.lngh, 2);
> fout.Write(VetaS.cod1, 32);
> fout.Size := fout.Position;
> fout.free;
> end;


Odpovedá: Pavel Hauptman

17. 9. 2004 9:10

To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
operaci Pointer(S)^.

Pavel Hauptman

> var
> FS : TFileStream;
> S : string;
> begin
> S := 'Ahoj';
> FS := TFileStream.Create(.., ..);
> try
> FS.Write(Pointer(S)^, Length(S));
> finally
> FS.Free;
> end;
> end;


Odpovedá: Ondrej Kelle

17. 9. 2004 9:17

> var
> FS : TFileStream;
> S : string;
> begin
> S := 'Ahoj';
> FS := TFileStream.Create(.., ..);
> try
> FS.Write(Pointer(S)^, Length(S));
> finally
> FS.Free;
> end;
> end;

To ano, ale v jeho pripade sa jedna o shortstring, ktory je staticky
alokovany. Pretypovanie na Pointer je invalid typecast.

>> type TVetaS = record
>> lngh: word;
>> cod1: string[32];
>> end;
>> var VetaS: TVetaS;
[snip]

V pripade shortstringu to ma byt takto:

  fout.Write(VetaS.cod1[1], 32);

Prvy byte (.cod1[0]) totiz obsahuje dlzku stringu.

HTH
TOndrej


Odpovedá: Milan Tomes

17. 9. 2004 9:56

A co tohle:

@S[1]

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Pavel Hauptman
> Sent: Friday, September 17, 2004 10:08 AM
>
> To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
> kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
> operaci Pointer(S)^.
>
> Pavel Hauptman
>
> > var
> > FS : TFileStream;
> > S : string;
> > begin
> > S := 'Ahoj';
> > FS := TFileStream.Create(.., ..);
> > try
> > FS.Write(Pointer(S)^, Length(S));
> > finally
> > FS.Free;
> > end;
> > end;
>
>
>


Odpovedá: Miso

17. 9. 2004 9:52


----- Original Message -----
From: "Pavel Hauptman" <phauptman@bilbo.cz>


> To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
> kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
> operaci Pointer(S)^.
>

..tak skus nieco taketo..je to sice naopak, t.j. obsah suboru natiahnem do
WideString, ale mozes sa inspirovat
----------
function GetData(var Data: WideString): Integer;
var f : TFileStream;
    ss : TStringStream;
begin
  result := -1;
  try
    try
      if FileExists(FullPath) then
        f := TFileStream.Create(FullPath, fmOpenRead);

      ss := TStringStream.Create('');
      try
        ss.CopyFrom(f, f.Size);
        Data := ss.DataString;
      finally
        FreeAndNil(ss);
      end;
    finally
      FreeAndNil(f);
    end;
  except on e:Exception do
    begin
      ShowMessage('Error : '+ e.Message);
      exit;
    end;
  end;

  result := 0;
end;
---------------------

Miso


Odpovedá: Petr Kuklik

17. 9. 2004 9:56

U TMemoryStream pouzivam prevod na pchar, pak to vypada takto

var Str : string;
      pStr : pchar;
     MS : TMemoryStream;

begin
.....

Str := 'ahoj';
pStr := pchar(Str);
MS.write(pStr[0], length(pSTr));

.....
end;

Myslim si, ze u TFileStreamu to bude stejne.

Petr


>>> "Pavel Hauptman" <phauptman@bilbo.cz> 17.9.2004 10:08:00 >>>
To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
operaci Pointer(S)^.

Pavel Hauptman

> var
> FS : TFileStream;
> S : string;
> begin
> S := 'Ahoj';
> FS := TFileStream.Create(.., ..);
> try
> FS.Write(Pointer(S)^, Length(S));
> finally
> FS.Free;
> end;
> end;